package com.jt;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * @author CCFu
 * @version 1.0
 * @date 2022/1/17 15:46
 */
@EnableFeignClients
@SpringBootApplication
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class,args);
    }

    /**
     * 通过此对象进行远程服务调用，也就是说去调用其他服务
     * 此对象基于HTTP协议进行服务调用的过程进行封装，提供了
     * 一些模板方法（get,post,put,delete..）,专门用于调用网络另一端的服务
     * @return
     */
    @Bean//bean的名字默认为方法名
    public RestTemplate restTemplate(){//基于此对象实现远端服务调用
        return new RestTemplate();
    }

    /**
     * @LoadBalanced 注解描述RestTemplate对象时,是告诉底层为
     * RestTemplate对象注入一个负载均衡拦截器,当我们使用RestTemplate
     * 进行远程服务调用时,首先执行负载均衡拦截器中的方法,在方法内部,
     * 基于服务发现这种机制,从nacos获取服务实例,然后再进行远程调用.
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate loadBalancedRestTemplate(){//基于此对象实现远端服务调用
        return new RestTemplate();
    }

    @Bean
    public IRule ribbonRule() {
        return new RandomRule();
    }
}
